const {
	Service
} = require('uni-cloud-router')

const uidObj = require('uni-id');

module.exports = class UtilsService extends Service {

	constructor(ctx) {
		super(ctx)
	}

	/**
	 * 日期格式化，默认为 'yyyy-MM-dd hh:mm:ss'
	 */
	formatdate(date, fmt) {
		date = this.toDate(date);

		fmt = fmt || 'yyyy-MM-dd hh:mm:ss'
		let o = {
			"M+": date.getMonth() + 1, //月份
			"d+": date.getDate(), //日
			"h+": date.getHours(), //小时
			"m+": date.getMinutes(), //分
			"s+": date.getSeconds(), //秒
			"q+": Math.floor((date.getMonth() + 3) / 3), //季度
			"S": date.getMilliseconds() //毫秒
		};

		if (/(y+)/.test(fmt))
			fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
		for (let k in o)
			if (new RegExp("(" + k + ")").test(fmt))
				fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[
					k]).length)));
		return fmt;
	}
	
	/**
	 * 将日期格式转换为 new Date()
	 */
	toDate(date) {
		if (typeof date === 'string') {
			date = date.replace(/\.|\-/g, '/');
		}
		if (typeof date !== 'object') {
			date = new Date(date);
		}
		
		return date;
	}
	
	// int 格式化（四舍五入），防止 js 精度丢失
	fmtInt(number) {
		number = parseFloat(number);
		if (isNaN(number)) return number;
		
		number = parseInt(number.toFixed(0));
		
		return number;
	}
	
	/**
	 * 将 UTC+0 转换为 UTC+8
	 */
	toDateUTC8(date) {
		date = this.toDate(date);
		if (uniCloud.$provider == 'alipay') {
			// 支付宝云，默认为 UTC+8
			return date;
		}
		
		// 小时 UTC+0 转换为 UTC+8
		date.setHours(date.getHours() + 8);
		return date;
	}

	/**
	 * 获取指定日期属于第几周
	 */
	getWeekDay(date) {
		let d2 = new Date(this.toDate(date));
		
		d2.setMonth(0);
		d2.setDate(1);
		
		let days = Math.ceil((this.toDate(date) - d2) / (24 * 60 * 60 * 1000));
		let week = Math.ceil(days / 7);
		return week;
	}
	
	/**
	 * 获取当前是第几天
	 */
	getDayOfYear(date) {
		let d1 = this.toDate(this.formatdate(date, 'yyyy-01-01 00:00:00'));
		let d2 = this.toDate(this.formatdate(date, 'yyyy-MM-dd 23:59:59'));
		
		let days = Math.ceil((d2 - d1) / (24 * 60 * 60 * 1000)); 
		return days;
	}
	
	/**
	 * 判断一组日期是否持续
	 */
	continueDays(days) {
		days = days.sort().map((day, idx) => {
			let dt = this.toDate(day);
			
			dt.setDate(dt.getDate() - idx);
			
			dt.setHours(0);
			dt.setMinutes(0);
			dt.setSeconds(0);
			dt.setMilliseconds(0);
			
			return +dt;
		});
		
		return new Set(days).size === 1;
	}
	
	/**
	 * 获得用户数据，未登录抛出异常
	 */
	async getUser(token, member = false) {
		let user = {
			uid: '',
			uname: '',
			uheadimg: ''
		};
		
		if (token) {
			const userRes = await uidObj.checkToken(token);
			if (userRes.code == 0) {
				user.uid = userRes.uid;
				user.uname = userRes.userInfo.user_name || userRes.userInfo.nickname || userRes.userInfo.username;
				user.uheadimg = userRes.userInfo.user_headimg || userRes.userInfo.avatar;
			}
		}
		
		if (!user.uid) {
			this.throw('当前未登录');
		}
		
		return user;
	}
	
	/**
	 * 开通笔记功能
	 */
	async openNoteUser(uid, user, data = {}) {
		return await this.db.collection('usemall-shopping-user').add({
			_id: uid,
			notep_headimg: user.uheadimg,
			notep_name: user.uname,
			notep_note: 0,
			notep_attention: [],
			notep_fans: [],
			notep_collect: [],
			notep_likes:[],
			notep_praise: 0,
			notep_by_collect: 0,
			version: 1,
			is_delete: 0,
			create_time: Date.now(),
			create_uid: uid,
			...data
		});
	}
	
	/**
	 * 脱敏处理
	 * 	字符类 		
	 * 		2~3个字保留首位 	U**
	 * 		4~5个字保留首尾 	U***m
	 * 		大于5个字保留前3 + *****
	 * 		Use*****
	 * 	手机类 		
	 * 		保留前3后3
	 * 		188*****333
	 * 	邮箱类 		
	 * 		保留前3 + ******.com
	 * 		Use******.com
	 * 	身份证类 	
	 * 		保留前5后3
	 * 		58123**********132
	*/
	desz(str) {
		if (!str) return '';
		str = str.trim();
		const len = str.length;
		
		if (len == 1) return str + '*';
		
		// 字符类
		if (len >= 2 && len <= 3) return str.substr(0, 1).padEnd(len, '*');
		// 4~5个字保留首尾
		if (len >= 4 && len <= 5) return str.substr(0, 1).padEnd(len - 1, '*') + str.substring(len - 1);
		
		// 手机类 保留前3后3
		if (/(^1[0-9][0-9]{9}$)/.test(str)) return str.substr(0, 3).padEnd(len - 3, '*') + str.substring(len - 3);
		
		// todo 邮箱类 
		
		// todo 身份证类
		
		
		// 大于5个字保留前3 + *****
		if (len > 5) return str.substr(0, 3).padEnd(len > 8 ? 8 : len, '*');
	}
	
	/**
	 * 订单配置
	 */
	async getOrderConfig() {
		const configRes = await this.db.collection('usemall-order-parameter').limit(1).get();
		
		const [orderConfig = {}] = configRes.data;
		
		return orderConfig;
	}
	
	getConfig() {
		const config = require('../config.json');
		
		return config;
	}
	
	
	/**
	 * 获取指定位数随机数
	 * 默认6位
	 */
	getRCode(num = 6) {
		const str = '1435AaBbCcDdEe4891FfGgHhJjKk567MmNnPpQqRrSs235TtUuVvWwXxYyZ1289';
	
		const arr = [];
		for (let i = 0; i < num; i++) {
			arr.push(str[Math.floor(Math.random() * str.length)]);
		}
	
		return arr.join('');
	}
}
